package com.jusha.formulacalculation.functions;

import com.jusha.formulacalculation.Result;

/**
 * 内置函数支持
 */
public class LoadDefaultFunctions {
    public static void load() {
        //常量
        /**
         * π
         */
        ManageFunctions.add("pi", args -> new Result(Math.PI));
        /**
         * 自然常数
         */
        ManageFunctions.add("e", args -> new Result(Math.E));

        //函数
        /**
         * 绝对值
         */
        ManageFunctions.add("abs", 1, args -> new Result(Math.abs(args[0])));

        /**
         * 返回arg1的arg2次幂。
         * 参数：
         * arg1:
         */
        ManageFunctions.add("pow", 2, args -> new Result(Math.pow(args[0], args[1])));

        /**
         * 四舍五入
         */
        ManageFunctions.add("round", 1, args -> new Result(Math.round(args[0])));

        /**
         * 向下取整
         */
        ManageFunctions.add("floor", 1, args -> new Result(Math.floor(args[0])));

        /**
         * 向上取整
         */
        ManageFunctions.add("ceil", 1, args -> new Result(Math.ceil(args[0])));


        /**
         * 求平方根
         */
        ManageFunctions.add("sqrt", 1, args -> new Result(Math.sqrt(args[0])));

        /**
         * sin函数
         */
        ManageFunctions.add("sin", 1, args -> new Result(Math.sin(args[0])));

        /**
         * cos函数
         */
        ManageFunctions.add("cos", 1, args -> new Result(Math.cos(args[0])));

        /**
         * tan函数
         */
        ManageFunctions.add("tan", 1, args -> new Result(Math.tan(args[0])));

        /**
         * arcsin函数
         */
        ManageFunctions.add("arcsin", 1, args -> new Result(Math.asin(args[0])));

        /**
         * arccos函数
         */
        ManageFunctions.add("arccos", 1, args -> new Result(Math.acos(args[0])));

        /**
         * arctan函数
         */
        ManageFunctions.add("arctan", 1, args -> new Result(Math.atan(args[0])));

        /**
         * csc函数
         */
        ManageFunctions.add("csc", 1, args -> new Result(1 / Math.sin(args[0])));

        /**
         * sec函数
         */
        ManageFunctions.add("sec", 1, args -> new Result(1 / Math.cos(args[0])));

        /**
         * cot函数
         */
        ManageFunctions.add("cot", 1, args -> new Result(Math.cos(args[0]) / Math.sin(args[0])));

        /**
         * log函数
         */
        ManageFunctions.add("log", 1, args -> new Result(Math.log(args[0]) / Math.log(Math.E)));
        /**
         * ln函数
         */
        ManageFunctions.add("ln", 1, args -> new Result(Math.log(args[0])));
        /**
         * lg函数
         */
        ManageFunctions.add("lg", 1, args -> new Result(Math.log10(args[0])));

        /**
         * 随机数函数
         */
        ManageFunctions.add("random", args -> new Result(Math.random()));

        /**
         * 阶乘函数
         */
        ManageFunctions.add("fact", 0, args -> {
            if (args[0] == 0)
                return Result.ok(1);
            else if (args[0] < 0)
                return Result.ok(0);
            else {
                double v = 1;
                double i = Math.floor(args[0]);
                while (i > 0) {
                    v = v * i;
                    i = i - i;
                }
                return Result.ok(i);
            }
        });

    }

}
